This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

<<<<<<< Updated upstream ======= <<<<<<< HEAD

Test Test Test

library(data.table)
library(tidyr)
library(maps)
library(haven)
library(ggplot2)
library(dplyr)
======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

<<<<<<< Updated upstream ======= <<<<<<< HEAD <<<<<<< HEAD
library(readxl)
hardship_complete <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/data/Hardship_complete.xlsx")
hardship_complete
hardship_complete$mean_homicide=log(hardship_complete$mean_homicide)
hardship_complete$gdp=log(hardship_complete$gdp)
hardship_complete$Infant_mortality=log(hardship_complete$Infant_mortality)
hardship_complete$life_expect=log(hardship_complete$life_expect)
hardship_complete$gini_income=log(hardship_complete$gini_income)
hardship_complete$`primary_ female_ enrollment_ rate`=log(hardship_complete$`primary_ female_ enrollment_ rate`)
hardship_complete

# Reverse Codierung
hardship_complete$mean_homicide=scale(hardship_complete$mean_homicide)
hardship_complete$gdp=scale(-hardship_complete$gdp)
hardship_complete$Infant_mortality=scale(hardship_complete$Infant_mortality)
hardship_complete$life_expect=scale(-hardship_complete$life_expect)
hardship_complete$gini_income=scale(hardship_complete$gini_income)
hardship_complete$gini_income=scale(-hardship_complete$`primary_ female_ enrollment_ rate`)
hardship_complete

hardship_complete$hardship_index=(hardship_complete$mean_homicide+hardship_complete$gdp+hardship_complete$gini_income+hardship_complete$life_expect+hardship_complete$Infant_mortality+hardship_complete$`primary_ female_ enrollment_ rate`)/6

hardship_complete
=======
library(readxl)
hardship_complete <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/code/Hardship_complete_2024.xlsx")
hardship_complete
NA
NA
hardship_complete$homiciderate=log(hardship_complete$homiciderate)
hardship_complete$gdp=log(hardship_complete$gdp)
hardship_complete$infantmortality=log(hardship_complete$infantmortality)
hardship_complete$lifeexpectancy=log(hardship_complete$lifeexpectancy)

hardship_complete

# Reverse Codierung
hardship_complete$homiciderate=scale(hardship_complete$homiciderate)
hardship_complete$gdp=scale(-hardship_complete$gdp)
hardship_complete$infantmortality=scale(hardship_complete$infantmortality)
hardship_complete$lifeexpectancy=scale(-hardship_complete$lifeexpectancy)
hardship_complete$gini=scale(hardship_complete$gini)
hardship_complete$femalemale_primedu=scale(-hardship_complete$femalemale_primedu)
hardship_complete

hardship_complete$hardship_index=(hardship_complete$homiciderate+hardship_complete$gdp+hardship_complete$gini+hardship_complete$lifeexpectancy+hardship_complete$infantmortality+hardship_complete$femalemale_primedu)/6

hardship_complete

# Laura added this code
library(dplyr)

# Impute missing values in the hardship indicators using the median
hardship_complete <- hardship_complete %>%
  mutate(across(c("homiciderate", "gdp", "infantmortality", "lifeexpectancy", "gini", "femalemale_primedu"),
                ~ifelse(is.na(.), median(., na.rm = TRUE), .)))

hardship_complete

# Use the mutate function to change the country name
hardship_complete <- hardship_complete %>%
  mutate(country = ifelse(label == "Serbia and Montenegro", "Serbia", label))
hardship_complete
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> Stashed changes

Checking Effectiveness of Imputation Method

<<<<<<< Updated upstream ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD
# Data of Wave 5


WV5_data <- readRDS("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/F00007944-WV5_Data_R_v20180912.rds")


# Convert WV5_data-object in data.frame 
WV5_data_df <- as.data.frame(WV5_data)

# show first five columns
WV5_data_df
<<<<<<< HEAD =======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD
#rename the variables
WV5_data <- WV5_data_df %>%
  rename(gender = V235, age = V237, country_code = V2, wave = V1, risktaking = V86, children = V56, married = V55, employed = V241, education = V238)
<<<<<<< HEAD
WV5_data

colnames(WV5_data)



#select only the variables of interest
=======
WV5_data

colnames(WV5_data)
  [1] "wave"          "V1A"           "V1B"           "country_code"  "V2A"           "V3"            "V4"            "V4_CO"         "V5"           
 [10] "V5_CO"         "V6"            "V6_CO"         "V7"            "V7_CO"         "V8"            "V8_CO"         "V9"            "V9_CO"        
 [19] "V10"           "V11"           "V12"           "V13"           "V14"           "V15"           "V16"           "V17"           "V18"          
 [28] "V19"           "V20"           "V21"           "V22"           "V23"           "V24"           "V25"           "V26"           "V27"          
 [37] "V28"           "V29"           "V30"           "V31"           "V32"           "V33"           "V34"           "V35"           "V36"          
 [46] "V37"           "V38"           "V39"           "V40"           "V41"           "V42"           "V43"           "V43_01"        "V43_02"       
 [55] "V43_03"        "V43_04"        "V43_05"        "V43_06"        "V43_07"        "V43_08"        "V43_09"        "V43_10"        "V43_11"       
 [64] "V43_12"        "V43_13"        "V43_14"        "V43_15"        "V43_16"        "V43_17"        "V43_18"        "V43_19"        "V43_20"       
 [73] "V43_21"        "V43_22"        "V43_23"        "V43_24"        "V43_25"        "V43_26"        "V43_27"        "V43_28"        "V43_29"       
 [82] "V43_30"        "V44"           "V45"           "V46"           "V47"           "V48"           "V49"           "V50"           "V51"          
 [91] "V52"           "V53"           "V54"           "married"       "children"      "V57"           "V58"           "V59"           "V60"          
[100] "V61"           "V62"           "V63"           "V64"           "V65"           "V66"           "V67"           "V68"           "V69"          
[109] "V69_HK"        "V70"           "V70_HK"        "V71"           "V72"           "V73"           "V73_HK"        "V74"           "V74_HK"       
[118] "V75"           "V76"           "V77"           "V78"           "V79"           "V80"           "V81"           "V82"           "V83"          
[127] "V84"           "V85"           "risktaking"    "V87"           "V88"           "V89"           "V90"           "V91"           "V92"          
[136] "V93"           "V94"           "V95"           "V96"           "V97"           "V98"           "V99"           "V100"          "V101"         
[145] "V102"          "V103"          "V104"          "V105"          "V106"          "V107"          "V108"          "V109"          "V110"         
[154] "V111"          "V112"          "V113"          "V114"          "V115"          "V116"          "V117"          "V118"          "V119"         
[163] "V120"          "V121"          "V122"          "V123"          "V124"          "V125"          "V126"          "V127"          "V128"         
[172] "V129"          "V130"          "V130_CA_1"     "V130_IQ_1"     "V130_IQ_2"     "V130_IQ_3"     "V130_IQ_4"     "V130_NZ_1"     "V130_NZ_2"    
[181] "V131"          "V132"          "V133"          "V134"          "V135"          "V136"          "V137"          "V138"          "V139"         
[190] "V140"          "V141"          "V142"          "V143"          "V144"          "V145"          "V146_00"       "V146_01"       "V146_02"      
[199] "V146_03"       "V146_04"       "V146_05"       "V146_06"       "V146_07"       "V146_08"       "V146_09"       "V146_10"       "V146_11"      
[208] "V146_12"       "V146_13"       "V146_14"       "V146_15"       "V146_16"       "V146_17"       "V146_18"       "V146_19"       "V146_20"      
[217] "V146_21"       "V146_22"       "V147"          "V148"          "V149"          "V150"          "V151"          "V151_IQ_A"     "V151_IQ_B"    
[226] "V152"          "V153"          "V154"          "V155"          "V156"          "V157"          "V158"          "V159"          "V160"         
[235] "V161"          "V162"          "V163"          "V164"          "V165"          "V166"          "V167"          "V168"          "V169"         
[244] "V170"          "V171"          "V172"          "V173"          "V174"          "V175"          "V176"          "V177"          "V178"         
[253] "V179"          "V180"          "V181"          "V182"          "V183"          "V184"          "V185"          "V186"          "V187"         
[262] "V188"          "V189"          "V190"          "V191"          "V192"          "V193"          "V194"          "V195"          "V196"         
[271] "V197"          "V198"          "V199"          "V200"          "V201"          "V202"          "V203"          "V204"          "V205"         
[280] "V206"          "V207"          "V208"          "V209"          "V210"          "V211"          "V212"          "V213A"         "V213B"        
[289] "V213C"         "V213D"         "V213E"         "V213F"         "V213G"         "V213H"         "V213K"         "V213L"         "V213M"        
[298] "V213N"         "V214"          "V215"          "V216"          "V217"          "V218"          "V219"          "V220"          "V221"         
[307] "V222"          "V223"          "V224"          "V225"          "V226"          "V227"          "V228"          "V229"          "V230"         
[316] "V231"          "V232"          "V233"          "V233A"         "V234"          "gender"        "V236"          "age"           "education"    
[325] "V238CS"        "V239"          "V240"          "employed"      "V242"          "V242A_CO"      "V243"          "V244"          "V245"         
[334] "V246"          "V247"          "V248"          "V249"          "V250"          "V251"          "V252"          "V252B"         "V253"         
[343] "V253CS"        "V254"          "V255"          "V255CS"        "V256"          "V257"          "V257B"         "V257C"         "V258"         
[352] "V259"          "V259A"         "V260"          "V261"          "V262"          "V263"          "V264"          "V265"          "S024"         
[361] "S025"          "Y001"          "Y002"          "Y003"          "SACSECVAL"     "SECVALWGT"     "RESEMAVAL"     "WEIGHTB"       "I_AUTHORITY"  
[370] "I_NATIONALISM" "I_DEVOUT"      "DEFIANCE"      "WEIGHT1A"      "I_RELIGIMP"    "I_RELIGBEL"    "I_RELIGPRAC"   "DISBELIEF"     "WEIGHT2A"     
[379] "I_NORM1"       "I_NORM2"       "I_NORM3"       "RELATIVISM"    "WEIGHT3A"      "I_TRUSTARMY"   "I_TRUSTPOLICE" "I_TRUSTCOURTS" "SCEPTICISM"   
[388] "WEIGHT4A"      "I_INDEP"       "I_IMAGIN"      "I_NONOBED"     "AUTONOMY"      "WEIGHT1B"      "I_WOMJOB"      "I_WOMPOL"      "I_WOMEDU"     
[397] "EQUALITY"      "WEIGHT2B"      "I_HOMOLIB"     "I_ABORTLIB"    "I_DIVORLIB"    "CHOICE"        "WEIGHT3B"      "I_VOICE1"      "I_VOICE2"     
[406] "I_VOI2_00"     "VOICE"         "WEIGHT4B"      "S001"          "S007"          "S018"          "S019"          "S021"          "COW"          
#select only the variables of interest
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
WV5_data <- WV5_data %>%
  dplyr::select(gender, age, country_code, wave, risktaking, children, married, employed, education)
WV5_data
<<<<<<< HEAD
# Read countrynames data from the CSV file (to decode the dataset 5)
countrynames <- read.csv("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/countrynames.txt", header = FALSE, as.is = TRUE)
colnames(countrynames) <- c("code", "name")

# Assuming WV5_data has a column named country_code
WV5_data$country <- countrynames$name[match(WV5_data$country_code, countrynames$code)]

# Check the frequency of each country in the new column
table(WV5_data$country)

# Display the updated WV5_data
print(WV5_data)
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#Read Dataset (Wave 6)

WV6_data <- load("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)
<<<<<<< HEAD =======
#Read Dataset (Wave 6)

WV6_data <- load("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD
WV6_data <- WV6_data %>%
  rename(wave = V1, gender = V240, age = V242,country_code = V2, risktaking = V76, children = V58, married = V57, employed = V229, education = V248)


#select only the variables of interest

WV6_data <- WV6_data %>%
  dplyr::select(wave, gender, age, country_code,risktaking, children, married, employed, education)
WV6_data
countrynames = read.csv("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country = countrynames$name [match(WV6_data$country_code, countrynames$code)]
table(WV6_data$country)
WV6_data
<<<<<<< HEAD
WV5_data
WV6_data
WVS_data = rbind(WV5_data, WV6_data)
WVS_data

unique(WVS_data$age)
range(WVS_data$age)
=======

WVS_data = rbind(WV5_data, WV6_data)
WVS_data

country_counts <- WVS_data %>%
  count(country)

# Print the result
print(country_counts)
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429




WVS_data = subset(WVS_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave5 = subset(WV5_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave6 = subset(WV6_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
WVS_data <- na.omit(WVS_data)
data_Wave5 <- na.omit(data_Wave5)
data_Wave6 <- na.omit(data_Wave6)









# Use the mutate function to change the country name
WVS_data <- WVS_data %>%
  mutate(country = ifelse(country == "Great Britain", "United Kingdom", country))
<<<<<<< HEAD
# Transfrom risk item such that high values represent more risk taking
WVS_data$risktaking = 6 - WVS_data$risktaking + 1

  
# Transform risk variable into T-score (mean = 50, sd = 10)
WVS_data$T_score_risktaking = 10*scale(WVS_data$risktaking, center=TRUE,scale=TRUE)+50

WVS_data

#Transform risk variable into Z score 

# Assuming T-scores have a mean of 50 and a standard deviation of 10
WVS_data$Z_score_risktaking = (WVS_data$T_score_risktaking - 50) / 10

# Print the resulting data frame
print(WVS_data)

WVS_data <- WVS_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))
WVS_data
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> Stashed changes <<<<<<< Updated upstream ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD
unique(WVS_data$country)
<<<<<<< HEAD
WVS_mixed_model <- left_join(WVS_data, hardship, by = "country")
WVS_mixed_model
head(WVS_mixed_model)
library(lmerTest)

# intercept only model
model0 = lmer(Z_score_risktaking ~ 1 + (1|country),data = WVS_mixed_model)
summary_model0=summary(model0)
summary_model0
=======
 [1] "Andorra"             "Argentina"           "Australia"           "Brazil"              "Bulgaria"           
 [6] "Burkina Faso"        "Canada"              "Cyprus (G)"          "Chile"               "China"              
[11] "Egypt"               "Ethiopia"            "Finland"             "France"              "Georgia"            
[16] "Germany"             "Ghana"               "Hungary"             "India"               "Indonesia"          
[21] "Iran"                "Japan"               "Malaysia"            "Mali"                "Mexico"             
[26] "Moldova"             "Morocco"             "Netherlands"         "Norway"              "Peru"               
[31] "Poland"              "Romania"             "Russia"              "Rwanda"              "Slovenia"           
[36] "South Africa"        "South Korea"         "Spain"               "Sweden"              "Switzerland"        
[41] "Taiwan"              "Thailand"            "Trinidad and Tobago" "Turkey"              "Ukraine"            
[46] "United Kingdom"      "Uruguay"             "Viet Nam"            "Zambia"              "Algeria"            
[51] "Armenia"             "Azerbaijan"          "Belarus"             "Colombia"            "Ecuador"            
[56] "Estonia"             "Haiti"               "Iraq"                "Jordan"              "Kazakhstan"         
[61] "Kuwait"              "Kyrgyzstan"          "Lebanon"             "Libya"               "New Zealand"        
[66] "Nigeria"             "Pakistan"            "Palestine"           "Philippines"         "Qatar"              
[71] "Singapore"           "Tunisia"             "United States"       "Uzbekistan"          "Yemen"              
[76] "Zimbabwe"           
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
# age, sex 
model1 = lmer(T_score_risktaking ~ 1 +scale(age)+factor(gender) + (1+scale(age)+factor(gender)|country),data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
summary_model1
<<<<<<< HEAD =======
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) +      factor(gender) | country)
   Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa")

REML criterion at convergence: 1081364

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.4737 -0.7821 -0.0770  0.7536  3.2222 

Random effects:
 Groups   Name            Variance Std.Dev. Corr     
 country  (Intercept)      6.6199  2.5729            
          scale(age)       0.7621  0.8730   0.30     
          factor(gender)1  0.8747  0.9353   0.13 0.27
 Residual                 84.6046  9.1981            
Number of obs: 148527, groups:  country, 76

Fixed effects:
                Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)      51.4031     0.2977 75.2144  172.66   <2e-16 ***
scale(age)       -2.0093     0.1042 73.1211  -19.28   <2e-16 ***
factor(gender)1  -2.3174     0.1194 72.3693  -19.41   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g)
scale(age)  0.291        
fctr(gndr)1 0.072  0.236 
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#model 2
library(lme4)

library(lme4)
library(lmerTest)

# Define the lmer model and assign it to 'model_2'
model_2 <- lmer(T_score_risktaking ~ 1 + scale(age) + factor(gender) + factor(children) + 
                 factor(married) + factor(education) + factor(employed) +
                 (1 + scale(age) + factor(gender) + factor(children) + factor(employed) +
                  factor(married) | country),
                data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))


# Display the summary of the model
summary_model_2 = summary(model_2)
summary_model_2
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) + factor(gender) + factor(children) +  
    factor(married) + factor(education) + factor(employed) +  
    (1 + scale(age) + factor(gender) + factor(children) + factor(employed) +          factor(married) | country)
   Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+05))

REML criterion at convergence: 1079996

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.5457 -0.7815 -0.0813  0.7425  3.1678 

Random effects:
 Groups   Name              Variance Std.Dev. Corr                         
 country  (Intercept)        5.4671  2.3382                                
          scale(age)         0.5367  0.7326    0.24                        
          factor(gender)1    0.9298  0.9642    0.03  0.24                  
          factor(children)1  0.7895  0.8885    0.07  0.19  0.11            
          factor(employed)1  0.3133  0.5597    0.04  0.03  0.02 -0.27      
          factor(married)1   0.4120  0.6419    0.22  0.43  0.57  0.20 -0.13
 Residual                   83.7217  9.1500                                
Number of obs: 148527, groups:  country, 76

Fixed effects:
                     Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)         5.204e+01  2.809e-01  8.000e+01 185.238  < 2e-16 ***
scale(age)         -1.478e+00  9.081e-02  7.228e+01 -16.275  < 2e-16 ***
factor(gender)1    -2.171e+00  1.234e-01  7.259e+01 -17.597  < 2e-16 ***
factor(children)1  -1.274e+00  1.284e-01  7.199e+01  -9.920 4.14e-15 ***
factor(married)1   -8.367e-01  9.872e-02  6.267e+01  -8.475 5.49e-12 ***
factor(education)1  7.809e-01  6.489e-02  1.407e+05  12.033  < 2e-16 ***
factor(employed)1   1.056e-01  8.590e-02  7.071e+01   1.229    0.223    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g) fctr(g)1 fctr(c)1 fctr(mr)1 fctr(d)1
scale(age)   0.224                                            
fctr(gndr)1 -0.022  0.212                                     
fctr(chld)1 -0.016  0.047  0.032                              
fctr(mrrd)1  0.134  0.297  0.409   -0.083                     
fctr(dctn)1 -0.172  0.081  0.013    0.026   -0.013            
fctr(mply)1 -0.029  0.061  0.083   -0.203   -0.099    -0.063  
WVS_mixed_model
NA
NA
# age, sex 
model1 = lmer(T_score_risktaking ~ 1 +scale(age)+factor(gender) + (1+scale(age)+factor(gender)|country),data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
summary_model1
======= >>>>>>> Stashed changes <<<<<<< Updated upstream ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD <<<<<<< HEAD
model_3 <- lmer(T_score_risktaking ~ 1 + scale(z_score_age) * hardship_index + 
                    factor(gender) * hardship_index + factor(married) + factor(children) + 
                    factor(education) + factor(employed) + 
                    (1 + scale(z_score_age) + factor(married) + factor(children) + 
                     factor(education) + factor(employed) | country),
                data = WVS_mixed_model)

summary(model_3)
=======
model_3 <- lmer(T_score_risktaking ~ 1 + scale(age) * hardship_index + 
                    factor(gender) * hardship_index + factor(married) + factor(children) + 
                    factor(education) + factor(employed) + 
                    (1 + scale(age) + factor(married) + factor(children) + 
                     factor(education) + factor(employed) | country),
                data = WVS_mixed_model,control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))

summary_model_3 = summary(model_3) 

summary_model_3
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) * hardship_index + factor(gender) *  
    hardship_index + factor(married) + factor(children) + factor(education) +  
    factor(employed) + (1 + scale(age) + factor(married) + factor(children) +      factor(education) + factor(employed) | country)
   Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+05))

REML criterion at convergence: 1080093

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.57571 -0.78110 -0.08036  0.74750  3.13409 

Random effects:
 Groups   Name               Variance Std.Dev. Corr                         
 country  (Intercept)         5.5510  2.3561                                
          scale(age)          0.3952  0.6286    0.17                        
          factor(married)1    0.4028  0.6347    0.13  0.13                  
          factor(children)1   0.8063  0.8980    0.09  0.06  0.25            
          factor(education)1  0.6332  0.7957   -0.20  0.03  0.07 -0.13      
          factor(employed)1   0.2881  0.5368    0.00  0.08 -0.29 -0.25  0.16
 Residual                    83.8078  9.1547                                
Number of obs: 148527, groups:  country, 76

Fixed effects:
                                 Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                     5.204e+01  2.862e-01  7.433e+01 181.838  < 2e-16 ***
scale(age)                     -1.442e+00  8.035e-02  7.109e+01 -17.949  < 2e-16 ***
hardship_index                  4.588e-01  3.840e-01  7.514e+01   1.195    0.236    
factor(gender)1                -2.081e+00  5.032e-02  1.285e+05 -41.359  < 2e-16 ***
factor(married)1               -8.145e-01  9.857e-02  6.114e+01  -8.263 1.53e-11 ***
factor(children)1              -1.302e+00  1.292e-01  7.512e+01 -10.070 1.39e-15 ***
factor(education)1              7.768e-01  1.205e-01  5.044e+01   6.447 4.24e-08 ***
factor(employed)1               1.031e-01  8.357e-02  6.975e+01   1.233    0.222    
scale(age):hardship_index       4.751e-01  1.122e-01  7.216e+01   4.233 6.68e-05 ***
hardship_index:factor(gender)1  5.799e-01  6.902e-02  6.340e+04   8.403  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g) hrdsh_ fctr(g)1 fctr(mr)1 fctr(c)1 fctr(d)1 fctr(mp)1 sc():_
scale(age)   0.158                                                                    
hardshp_ndx  0.067  0.034                                                             
fctr(gndr)1 -0.098  0.042  0.002                                                      
fctr(mrrd)1  0.066  0.078 -0.005  0.044                                               
fctr(chld)1  0.005 -0.062 -0.003 -0.087   -0.054                                      
fctr(dctn)1 -0.285  0.080  0.014  0.016    0.030    -0.069                            
fctr(mply)1 -0.056  0.095  0.006  0.145   -0.190    -0.186    0.046                   
scl(g):hrd_  0.032  0.091  0.191  0.002   -0.005     0.005   -0.002   -0.035          
hrdshp_:()1 -0.002  0.011 -0.092  0.057   -0.012    -0.006    0.006    0.030     0.023
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD <<<<<<< HEAD
anova(model0,model1)
anova(model1,model_2)
anova(model_2,model_3) 
=======
======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes <<<<<<< Updated upstream ======= <<<<<<< HEAD
random_effects <- ranef(model_2)
random_effects
$country
                    (Intercept)   scale(age) factor(gender)1 factor(children)1 factor(employed)1 factor(married)1
Algeria              1.93351855 -0.854619155      0.87619718      -2.437881334        0.17698875     -0.377226443
Andorra              1.91309921  0.100909057     -0.66981587      -0.632350380        0.20524734     -0.686912835
Argentina           -1.57325789  0.057299092     -0.25780065      -1.067941885       -0.04621841     -0.553872390
Armenia              1.08284389 -0.454274344     -0.89771357      -0.834967062        0.17426467     -0.250770715
Australia           -0.14386428 -0.471375287     -1.06538548      -0.103260090        0.34608388     -0.365152174
Azerbaijan           0.45573171  0.004004243     -2.44218293       0.082693851       -0.21915868     -0.476480146
Belarus             -0.11536490 -1.000016058     -1.08120720      -0.467055853       -0.59713729     -0.046875401
Brazil              -2.84287325  0.262612027     -0.36729059      -0.148830175       -0.34944728     -0.655399532
Bulgaria            -0.77688584 -0.074197571      0.35410308       0.108171529        0.66545761     -0.168532781
Burkina Faso         1.61422833  1.156372503     -0.15049497       0.527033659       -0.25535458      0.423175478
Canada               0.39907784 -0.397232782     -1.02665629      -0.204786757        0.83298979     -0.733722779
Chile                1.03350248 -0.644167015      0.06242265      -1.191152814        0.30273676      0.182724595
China               -2.09375223 -0.445731013      0.50663419      -0.603547862       -0.41625835     -0.223192477
Colombia             0.22689773  0.422663335     -0.91548157      -0.850065668        0.05700229     -0.046926087
Cyprus (G)           2.25496876 -0.776460854     -0.79745197       0.050374871        0.20526698     -0.994122261
Ecuador              2.25294069 -0.040563584      0.75768462       1.082273600       -0.18216772      0.606966414
Egypt               -3.93763995  0.877857068      1.47333952      -0.977664255        0.69617277      0.506927589
Estonia             -1.06399862 -0.805260418     -0.20652339      -0.596528530        0.04115956     -0.263441563
Ethiopia             0.32293567  0.946455342      1.98005066      -0.482906872        1.19465275      0.520837889
Finland             -2.30711075 -0.193362752      0.06835226       0.109995921       -0.09624712     -0.446129133
France              -0.03262671 -0.315869185     -0.97254579      -0.756893462       -0.18841330     -0.721010031
Georgia             -0.34804857  0.313082762     -1.59932353       0.785006390        0.24885966     -0.322662614
Germany             -2.81688356 -0.866667483     -0.56600732      -0.067064088        0.10227997     -0.540483663
Ghana                4.20166977  0.817382387      1.03493510       1.320604468        0.06952553      0.935149120
Haiti               -6.53977492 -1.391127796      1.91289649       1.468940014       -0.89280260      0.533482158
Hungary             -1.99653091 -0.996752173     -0.17049773      -0.160714296        0.07124129     -0.186539589
India                1.43482568  0.617405603      0.45019893       1.836342889       -1.09159157      0.408036403
Indonesia            2.91129285  0.717729512     -0.37251725       0.036310599        0.61487372      0.351255947
Iran                 0.25704414 -0.273465758      0.84529203      -0.730085449        0.58356967     -0.185573571
Iraq                -1.06492016  0.012316662      0.43906584       0.138047194       -0.32549734      0.649008088
Japan               -6.33127212  0.980885912     -0.11206958       0.564989629       -0.44804909     -0.169376931
Jordan               1.80284181 -0.238660302     -0.04733756      -0.275114119        0.13106070      0.079727138
Kazakhstan          -2.61497176  0.099878889      0.38099799      -0.441649153        0.38909549      0.080016173
Kuwait               2.09145419 -1.486900320      0.10785659       0.216244412       -0.71982856     -0.372559647
Kyrgyzstan           0.61067751  1.072544199      1.07198178       0.701056752       -0.33081703      0.900953951
Lebanon              2.84470796 -0.023345343      0.08714121       0.523974067       -0.06162559      0.535210026
Libya                0.80327073 -0.475177836     -0.57060729       0.015373078        0.24676530     -0.259391475
Malaysia            -2.02257329  0.667498135      0.69083376       0.230243197       -0.12134511      0.648213460
Mali                 2.81563100  1.078784421      1.36765639       0.245910074       -0.30999444      1.287801120
Mexico              -0.40013922  0.561817933     -0.55226850      -1.131405064        0.01974498     -0.487453888
Moldova             -1.96423291 -0.329843137      1.07398956      -0.873396236        0.07687739      0.075323668
Morocco              0.68539027  0.249483178     -0.44534432      -0.309370915        0.01082943     -0.178509821
Netherlands         -2.06588418 -0.228085056     -0.89179246       0.412747451       -0.17127304     -0.633635212
New Zealand          0.60732681 -0.774713993      0.04302897      -0.175577939       -0.11512608     -0.279411963
Nigeria              5.59377567  1.275958637      1.62013094       0.389674844        0.37813269      1.361593143
Norway               0.99797819 -0.771979285      0.88446601      -0.045167601       -0.33921268     -0.013483356
Pakistan             4.22659980  1.325790041      0.51442825       0.928501617       -0.97792666      0.666654501
Palestine            0.03194219 -0.494835906     -0.14515969       0.292953341        0.50604479     -0.015691232
Peru                -1.61516779  0.633332407     -0.68009631      -0.717362556       -0.39962778     -0.181622730
Philippines          3.70377389  0.943369150      1.13088110       0.747509770       -0.08964864      0.356984425
Poland               2.19905667  0.037084593     -0.45404816      -0.900087529        0.25558657      0.232224025
Qatar                0.86028228  0.502376889     -0.94153784       0.200394431        0.45200189     -0.086160547
Romania             -2.52089552 -0.155453441     -0.24318156      -0.213424238        0.59038608     -0.046222935
Russia              -0.03564662  0.201433455     -0.04277014       0.338525048        0.55241645     -0.367819701
Rwanda               0.83617515  1.171444046      1.19476510       1.697279263       -0.29018529      0.335814980
Singapore            2.17597132  0.591444549      0.38684581      -0.017294940       -0.08165496      0.363947899
Slovenia             0.21102243 -1.245719908     -0.62662173      -0.617380784        0.28218849     -1.002740221
South Africa         2.37631040  0.311956458      1.26337006       1.080146122        0.68094981      0.751652547
South Korea          1.36893323 -0.405664050      0.80080531       0.341944092       -0.04931702      0.322300385
Spain                0.82809176 -0.466229484      0.62854866      -0.304041861        0.09422269     -0.358645793
Sweden               0.09920433 -0.328664254     -0.47169418      -0.328195601       -0.42679317     -0.438405460
Switzerland         -1.56290696  0.084346338     -1.48036381       0.605515233        0.14178415     -0.884764664
Taiwan              -4.35319381 -0.569177868     -0.09471962      -0.003120567       -0.38488863     -0.220827542
Thailand            -0.09358157  0.844688730      1.30128241       0.253396867       -0.53318528      1.057267847
Trinidad and Tobago  0.24160167 -0.343056024     -0.36770149       1.121472297        0.13881740      0.059010394
Tunisia             -0.42814434 -1.362242692     -0.53278180      -0.600878765       -0.28277064     -0.244015679
Turkey               0.94251912  0.120341608      0.37598170      -0.387346063        0.29373891      0.028586139
Ukraine             -1.58175919 -0.668879956     -0.36649799      -0.519892277        0.26972976     -0.001257245
United Kingdom       1.15668394 -0.030727372     -1.56593196      -0.489635482        0.10560093     -0.751106765
United States       -0.70200525 -0.752298720     -0.40433841       0.416924321        0.25359660     -0.253434481
Uruguay             -3.20629770 -0.108243534      0.34971574      -0.439094936       -0.31919572     -0.167863204
Uzbekistan           1.00109484  0.687012035     -0.28533330       0.716274322        0.20755393      0.141926144
Viet Nam            -3.44301278  0.598580704     -0.35309866       0.622440999       -0.56204886      0.334138408
Yemen               -3.91719513  0.062896576     -0.10339324      -0.646218561       -0.08885691     -0.219935374
Zambia               1.41695079  0.455513249      0.41766478       1.043367849       -0.57988565      1.261564524
Zimbabwe             1.68856739  0.396489975     -1.11595904       0.496697944       -0.32194635     -0.119112532

with conditional variances for “country” 
======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes
# Extract random effects for 'country'
# Assuming 'model' is your fitted lmer model
random_effects <- ranef(model_2)
random_effects
<<<<<<< Updated upstream ======= <<<<<<< HEAD
colnames(random_effects)
NULL
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> Stashed changes
regression_results_WVS <- WVS_data %>%
  group_by(country) %>%
  do(model = lm(Z_score_risktaking ~ scale(age) + gender, data = .)) %>%
  summarize(
    country = first(country),
    intercept_regression = coef(summary(model))[1, 1],
    slope_age_regression = coef(summary(model))[2, 1],
    slope_gender_regression = coef(summary(model))[3, 1]
  )

regression_results_WVS

random_effects <- ranef(model_2)
random_effects

colnames(random_effects)
<<<<<<< Updated upstream ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes
coefsallmodels=rbind(summary_model1$coefficients,
summary_model_2$coefficients,
summary_model_3$coefficients[c(1:2,4:8,3,9:10),])

write.csv(coefsallmodels,"coefsallmodels.csv")
# Read the CSV file into a data frame
gbd_mentalhealth <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/GBD_mentalhealth.xlsx")

gbd_mentalhealth

#select only the variables of interest
gbd_mentalhealth <- gbd_mentalhealth %>%
  dplyr::select(country, gender, age, cause, val, Measure)
gbd_mentalhealth


library(dplyr)

# Group data by country and age group, and calculate summary statistics
summary_by_country_age <- gbd_mentalhealth %>%
  group_by(country, age) %>%
  summarise(
    mean_DALYs = mean(val))  # Calculate mean of DALYs

library(dplyr)

# Assuming 'summary_by_country_age' contains your summarized dataset
mean_by_country <- summary_by_country_age %>%
  group_by(country) %>%
  summarise(mean_DALYs = mean(mean_DALYs))

# View the resulting mean by country
print(mean_by_country)

#log transform
mean_by_country$mean_DALYs=log(mean_by_country$mean_DALYs)
 
mean_by_country 

#Reverse codierung 
mean_by_country$mean_DALYs=scale(mean_by_country$mean_DALYs)

mean_by_country

#rename mean_DALYS
mental_health_index <- mean_by_country %>%
  rename('mental_health' = mean_DALYs)
mental_health_index
library(dplyr)

#######Anxiety disorders#########
#Filter data for a specific mental disorder (e.g., Anxiety Disorders)
anxiety_disorders <- gbd_mentalhealth %>%
  filter(cause == "Anxiety disorders")  # Change "Anxiety Disorders" to the desired disorder

# Calculate the mean of 'val' (Disability-Adjusted Life Years) across locations and ages
mean_DALYs <- mean(anxiety_disorders$val)

# Optionally, if you want to calculate mean by country:
anxiety_disorders <- anxiety_disorders %>%
  group_by(country) %>%
  summarise(mean_Anxiety_disorders = mean(val))

anxiety_disorders

#log transform
anxiety_disorders$mean_Anxiety_disorders=log(anxiety_disorders$mean_Anxiety_disorders)
 
anxiety_disorders

#Reverse codierung 
anxiety_disorders$mean_Anxiety_disorders=scale(anxiety_disorders$mean_Anxiety_disorders)
anxiety_disorders
mental_health_index
gbd_mentalhealth

# Assuming gbd_mentalhealth is your data frame containing the 'cause' column

# Get unique values of 'cause' column
unique_causes <- unique(gbd_mentalhealth$cause)

# Create a data frame with unique causes
cause_table <- data.frame(Cause = unique_causes)

# Print the cause table
print(cause_table)
#######Bulimia nervosa########
library(dplyr)

# Filter the data for 'Bulimia Nervosa'
bulimia_nervosa <- gbd_mentalhealth %>%
  filter(cause == "Bulimia nervosa")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(bulimia_nervosa$val)

# Optionally, calculate mean by country
bulimia_nervosa <- bulimia_nervosa %>%
  group_by(country) %>%
  summarise(mean_bulimia_nervosa = mean(val))

# Log transform the mean_bulimia_nervosa column
bulimia_nervosa$mean_bulimia_nervosa <- log(bulimia_nervosa$mean_bulimia_nervosa)

# Scale the mean_bulimia_nervosa column (if needed)
bulimia_nervosa$mean_bulimia_nervosa <- scale(bulimia_nervosa$mean_bulimia_nervosa)

# Print the resulting data frame
print(bulimia_nervosa)
print(anxiety_disorders)

gbd_mentalhealth
#####Attention-deficit/hyperactivity disorder
library(dplyr)


ADHD <- gbd_mentalhealth %>%
  filter(cause == "Attention-deficit/hyperactivity disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(ADHD$val)

# Optionally, calculate mean by country
ADHD <- ADHD %>%
  group_by(country) %>%
  summarise(mean_ADHD = mean(val))

# Log transform the mean_bulimia_nervosa column
ADHD$mean_ADHD <- log(ADHD$mean_ADHD)

# Scale the mean_bulimia_nervosa column (if needed)
ADHD$mean_ADHD <- scale(ADHD$mean_ADHD)

# Print the resulting data frame
print(ADHD)
#########Idiopathic development intellectual ability 
library(dplyr)


Idiopathic_developmental_intellectual_disability <- gbd_mentalhealth %>%
  filter(cause == "Idiopathic developmental intellectual disability")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(Idiopathic_developmental_intellectual_disability$val)

# Optionally, calculate mean by country
Idiopathic_developmental_intellectual_disability <- Idiopathic_developmental_intellectual_disability %>%
  group_by(country) %>%
  summarise(mean_Idiopathic_developmental_intellectual_disability = mean(val))

# Log transform the mean_bulimia_nervosa column
Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability <- log(Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability)

# Scale the mean_bulimia_nervosa column (if needed)
Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability <- scale(Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability)

# Print the resulting data frame
print(Idiopathic_developmental_intellectual_disability)
######Anorexia Nervosa

anorexia_nervosa <- gbd_mentalhealth %>%
  filter(cause == "Anorexia nervosa")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(anorexia_nervosa$val)

# Optionally, calculate mean by country
anorexia_nervosa <- anorexia_nervosa %>%
  group_by(country) %>%
  summarise(mean_anorexia_nervosa = mean(val))

# Log transform the mean_bulimia_nervosa column
anorexia_nervosa$mean_anorexia_nervosa <- log(anorexia_nervosa$mean_anorexia_nervosa)

# Scale the mean_bulimia_nervosa column (if needed)
anorexia_nervosa$mean_anorexia_nervosa <- scale(anorexia_nervosa$mean_anorexia_nervosa)

# Print the resulting data frame
print(anorexia_nervosa)
#####Depressive disorders#######

depressive_disorders <- gbd_mentalhealth %>%
  filter(cause == "Depressive disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(depressive_disorders$val)

# Optionally, calculate mean by country
depressive_disorders <- depressive_disorders %>%
  group_by(country) %>%
  summarise(mean_depressive_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
depressive_disorders$mean_depressive_disorders <- log(depressive_disorders$mean_depressive_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
depressive_disorders$mean_depressive_disorders <- scale(depressive_disorders$mean_depressive_disorders)

# Print the resulting data frame
print(depressive_disorders)
#######Autismus spectrum disorders######

autismus_spectrum_disorders <- gbd_mentalhealth %>%
  filter(cause == "Autism spectrum disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(autismus_spectrum_disorders$val)

# Optionally, calculate mean by country
autismus_spectrum_disorders <- autismus_spectrum_disorders %>%
  group_by(country) %>%
  summarise(mean_autismus_spectrum_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
autismus_spectrum_disorders$mean_autismus_spectrum_disorders <- log(autismus_spectrum_disorders$mean_autismus_spectrum_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
autismus_spectrum_disorders$mean_autismus_spectrum_disorders <- scale(autismus_spectrum_disorders$mean_autismus_spectrum_disorders)

# Print the resulting data frame
print(autismus_spectrum_disorders)
######Schizophrenia#######
schizophrenia <- gbd_mentalhealth %>%
  filter(cause == "Schizophrenia")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(schizophrenia$val)

# Optionally, calculate mean by country
schizophrenia <- schizophrenia %>%
  group_by(country) %>%
  summarise(mean_schizophrenia = mean(val))

# Log transform the mean_bulimia_nervosa column
schizophrenia$mean_schizophrenia <- log(schizophrenia$mean_schizophrenia)

# Scale the mean_bulimia_nervosa column (if needed)
schizophrenia$mean_schizophrenia <- scale(schizophrenia$mean_schizophrenia)

# Print the resulting data frame
print(schizophrenia)
#######Conduct disorders#########
conduct_disorders <- gbd_mentalhealth %>%
  filter(cause == "Conduct disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(conduct_disorders$val)

# Optionally, calculate mean by country
conduct_disorders <- conduct_disorders %>%
  group_by(country) %>%
  summarise(mean_conduct_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
conduct_disorders$mean_conduct_disorders <- log(conduct_disorders$mean_conduct_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
conduct_disorders$mean_conduct_disorders <- scale(conduct_disorders$mean_conduct_disorders)

# Print the resulting data frame
print(conduct_disorders)
########Eating disorders#########
eating_disorders <- gbd_mentalhealth %>%
  filter(cause == "Eating disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(eating_disorders$val)

# Optionally, calculate mean by country
eating_disorders <- eating_disorders %>%
  group_by(country) %>%
  summarise(mean_eating_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
eating_disorders$mean_eating_disorders <- log(eating_disorders$mean_eating_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
eating_disorders$mean_eating_disorders <- scale(eating_disorders$mean_eating_disorders)

# Print the resulting data frame
print(eating_disorders)
########Bipolar disorder#########
bipolar_disorder <- gbd_mentalhealth %>%
  filter(cause == "Bipolar disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(bipolar_disorder$val)

# Optionally, calculate mean by country
bipolar_disorder <- bipolar_disorder %>%
  group_by(country) %>%
  summarise(mean_bipolar_disorder = mean(val))

# Log transform the mean_bulimia_nervosa column
bipolar_disorder$mean_bipolar_disorder <- log(bipolar_disorder$mean_bipolar_disorder)

# Scale the mean_bulimia_nervosa column (if needed)
bipolar_disorder$mean_bipolar_disorder <- scale(bipolar_disorder$mean_bipolar_disorder)

# Print the resulting data frame
print(bipolar_disorder)
print(cause_table)
########Substance use disorders########

substance_use_disorders <- gbd_mentalhealth %>%
  filter(cause == "Substance use disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(substance_use_disorders$val)

# Optionally, calculate mean by country
substance_use_disorders <- substance_use_disorders %>%
  group_by(country) %>%
  summarise(mean_substance_use_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
substance_use_disorders$mean_substance_use_disorders <- log(substance_use_disorders$mean_substance_use_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
substance_use_disorders$mean_substance_use_disorders <- scale(substance_use_disorders$mean_substance_use_disorders)

# Print the resulting data frame
print(substance_use_disorders)
####Drug use disorders

drug_use_disorders <- gbd_mentalhealth %>%
  filter(cause == "Drug use disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(drug_use_disorders$val)

# Optionally, calculate mean by country
drug_use_disorders <- drug_use_disorders %>%
  group_by(country) %>%
  summarise(mean_drug_use_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
drug_use_disorders$mean_drug_use_disorders <- log(drug_use_disorders$mean_drug_use_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
drug_use_disorders$mean_drug_use_disorders <- scale(drug_use_disorders$mean_drug_use_disorders)

# Print the resulting data frame
print(drug_use_disorders)
##########Alcohol use disorders
alcohol_use_disorders <- gbd_mentalhealth %>%
  filter(cause == "Alcohol use disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(alcohol_use_disorders$val)

# Optionally, calculate mean by country
alcohol_use_disorders <- alcohol_use_disorders %>%
  group_by(country) %>%
  summarise(mean_alcohol_use_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
alcohol_use_disorders$mean_alcohol_use_disorders <- log(alcohol_use_disorders$mean_alcohol_use_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
alcohol_use_disorders$mean_alcohol_use_disorders <- scale(alcohol_use_disorders$mean_alcohol_use_disorders)

# Print the resulting data frame
print(alcohol_use_disorders)
#######Major depressive disorders
major_depressive_disorder <- gbd_mentalhealth %>%
  filter(cause == "Major depressive disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(major_depressive_disorder$val)

# Optionally, calculate mean by country
major_depressive_disorder <- major_depressive_disorder %>%
  group_by(country) %>%
  summarise(mean_major_depressive_disorder = mean(val))

# Log transform the mean_bulimia_nervosa column
major_depressive_disorder$mean_major_depressive_disorder <- log(major_depressive_disorder$mean_major_depressive_disorder)

# Scale the mean_bulimia_nervosa column (if needed)
major_depressive_disorder$mean_major_depressive_disorder <- scale(major_depressive_disorder$mean_major_depressive_disorder)

# Print the resulting data frame
print(major_depressive_disorder)
#######Dysthymia########

dysthymia <- gbd_mentalhealth %>%
  filter(cause == "Dysthymia")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(dysthymia$val)

# Optionally, calculate mean by country
dysthymia <- dysthymia %>%
  group_by(country) %>%
  summarise(mean_dysthymia = mean(val))

# Log transform the mean_bulimia_nervosa column
dysthymia$mean_dysthymia <- log(dysthymia$mean_dysthymia)

# Scale the mean_bulimia_nervosa column (if needed)
dysthymia$mean_dysthymia <- scale(dysthymia$mean_dysthymia)

# Print the resulting data frame
print(dysthymia)
library(dplyr)

# Perform left joins for each data frame on 'country'
final_mental_health_index <- mental_health_index %>%
  left_join(bulimia_nervosa, by = "country") %>%
  left_join(ADHD, by = "country") %>%
  left_join(Idiopathic_developmental_intellectual_disability, by = "country") %>%
  left_join(anorexia_nervosa, by = "country") %>%
  left_join(depressive_disorders, by = "country") %>%
  left_join(autismus_spectrum_disorders, by = "country") %>%
  left_join(conduct_disorders, by = "country") %>%
  left_join(schizophrenia, by = "country") %>%
  left_join(eating_disorders, by = "country") %>%
  left_join(bipolar_disorder, by = "country") %>%
  left_join(drug_use_disorders, by = "country") %>%
  left_join(alcohol_use_disorders, by = "country") %>%
  left_join(substance_use_disorders, by = "country") %>%
  left_join(major_depressive_disorder, by = "country") %>%
  left_join(dysthymia, by = "country")

# Display the resulting data frame
print(final_mental_health_index)

# Show the first few rows of the resulting data frame
head(final_mental_health_index)
indicators <- left_join(final_mental_health_index, hardship, by = "country")
indicators
head(indicators)

new_data <- left_join (WVS_data, indicators, by = "country")
new_data


# Transfrom risk item such that high values represent more risk taking
new_data$risktaking = 6 - new_data$risktaking + 1

  
# Transform risk variable into T-score (mean = 50, sd = 10)
new_data$T_score_risktaking = 10*scale(new_data$risktaking, center=TRUE,scale=TRUE)+50

new_data

#Transform risk variable into Z score 

# Assuming T-scores have a mean of 50 and a standard deviation of 10
new_data$Z_score_risktaking = (new_data$T_score_risktaking - 50) / 10

# Print the resulting data frame
print(new_data)

new_data <- new_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))
new_data
<<<<<<< Updated upstream ======= <<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes
library(lme4)

library(lme4)

model <- lmer(T_score_risktaking ~ scale(z_score_age) * mental_health +
               gender * mental_health +
               factor(married) + factor(children) +
               factor(education) + factor(employed) +
               (1 + scale(z_score_age) + factor(married) + factor(children) + 
                factor(education) + factor(employed) | country),
<<<<<<< Updated upstream
             data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
=======
<<<<<<< HEAD
<<<<<<< HEAD
             data = new_data)
=======
             data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
             data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes


summary(model)

# Assuming 'model' is a linear mixed-effects model (lmer), and you want to save coefficients to a CSV file

# Extract coefficients from the model summary
coefficients_df <- data.frame(summary(model)$coefficients)

# Write coefficients to a CSV file
write.csv(coefficients_df, "model_coefficients.csv", row.names = TRUE)
<<<<<<< Updated upstream ======= <<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 ======= >>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes

```

<<<<<<< Updated upstream
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1sb2coaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFJldmVyc2UgQ29kaWVydW5nCmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1zY2FsZShoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaSkKaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpCmhhcmRzaGlwX2NvbXBsZXRlCgpoYXJkc2hpcF9jb21wbGV0ZSRoYXJkc2hpcF9pbmRleD0oaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pK2hhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5K2hhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eStoYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpLzYKCmhhcmRzaGlwX2NvbXBsZXRlCgojIExhdXJhIGFkZGVkIHRoaXMgY29kZQpsaWJyYXJ5KGRwbHlyKQoKIyBJbXB1dGUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGhhcmRzaGlwIGluZGljYXRvcnMgdXNpbmcgdGhlIG1lZGlhbgpoYXJkc2hpcF9jb21wbGV0ZSA8LSBoYXJkc2hpcF9jb21wbGV0ZSAlPiUKICBtdXRhdGUoYWNyb3NzKGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IiwgImdpbmkiLCAiZmVtYWxlbWFsZV9wcmltZWR1IiksCiAgICAgICAgICAgICAgICB+aWZlbHNlKGlzLm5hKC4pLCBtZWRpYW4oLiwgbmEucm0gPSBUUlVFKSwgLikpKQoKaGFyZHNoaXBfY29tcGxldGUKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UobGFiZWwgPT0gIlNlcmJpYSBhbmQgTW9udGVuZWdybyIsICJTZXJiaWEiLCBsYWJlbCkpCmhhcmRzaGlwX2NvbXBsZXRlCmBgYApgYGB7cn0KIyBDaGVja2luZyBMb2cgVHJhbnNmb3JtYXRpb24gYW5kIFNjYWxpbmcvUmV2ZXJzaW5nOgoKc3VtbWFyeShoYXJkc2hpcF9jb21wbGV0ZVssIGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IildKQojIFZpc3VhbGl6ZSBkaXN0cmlidXRpb25zIGJlZm9yZSBhbmQgYWZ0ZXIgdHJhbnNmb3JtYXRpb24KZ2dwbG90KGhhcmRzaGlwX2NvbXBsZXRlLCBhZXMoeCA9IGdkcCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQmVmb3JlIFRyYW5zZm9ybWF0aW9uIikgKwogIHhsYWIoIkdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKCmdncGxvdChoYXJkc2hpcF9jb21wbGV0ZSwgYWVzKHggPSBzY2FsZSgtZ2RwKSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQWZ0ZXIgU2NhbGluZy9SZXZlcnNpbmciKSArCiAgeGxhYigiU2NhbGVkL1JldmVyc2VkIEdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKYGBgCgojIENoZWNraW5nIEVmZmVjdGl2ZW5lc3Mgb2YgSW1wdXRhdGlvbiBNZXRob2QKYGBge3J9CnN1bW1hcnkoaGFyZHNoaXBfY29tcGxldGVbLCBjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpXSkKYGBgCgoKCmBgYHtyfQojIERhdGEgb2YgV2F2ZSA1CgoKV1Y1X2RhdGEgPC0gcmVhZFJEUygiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL0YwMDAwNzk0NC1XVjVfRGF0YV9SX3YyMDE4MDkxMi5yZHMiKQoKCiMgQ29udmVydCBXVjVfZGF0YS1vYmplY3QgaW4gZGF0YS5mcmFtZSAKV1Y1X2RhdGFfZGYgPC0gYXMuZGF0YS5mcmFtZShXVjVfZGF0YSkKCiMgc2hvdyBmaXJzdCBmaXZlIGNvbHVtbnMKV1Y1X2RhdGFfZGYKYGBgCgoKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKCgojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQp1bmlxdWUoV1Y1X2RhdGEkY291bnRyeSkKCnByaW50KGNvdW50cnluYW1lcykKCmNvdW50cnlfY291bnRzIDwtIFdWNV9kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQoKCgpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCmNvdW50cnlfY291bnRzIDwtIFdWU19kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCgoKCgoKCgpgYGAKYGBge3J9CgoKCgpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCgoKCgoKCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIkdyZWF0IEJyaXRhaW4iLCAiVW5pdGVkIEtpbmdkb20iLCBjb3VudHJ5KSkKYGBgCmBgYHtyfQojIFRyYW5zZnJvbSByaXNrIGl0ZW0gc3VjaCB0aGF0IGhpZ2ggdmFsdWVzIHJlcHJlc2VudCBtb3JlIHJpc2sgdGFraW5nCldWU19kYXRhJHJpc2t0YWtpbmcgPSA2IC0gV1ZTX2RhdGEkcmlza3Rha2luZyArIDEKCiAgCiMgVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBULXNjb3JlIChtZWFuID0gNTAsIHNkID0gMTApCldWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyA9IDEwKnNjYWxlKFdWU19kYXRhJHJpc2t0YWtpbmcsIGNlbnRlcj1UUlVFLHNjYWxlPVRSVUUpKzUwCgpXVlNfZGF0YQoKI1RyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gWiBzY29yZSAKCiMgQXNzdW1pbmcgVC1zY29yZXMgaGF2ZSBhIG1lYW4gb2YgNTAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEwCldWU19kYXRhJFpfc2NvcmVfcmlza3Rha2luZyA9IChXVlNfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgLSA1MCkgLyAxMAoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoV1ZTX2RhdGEpCgpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoel9zY29yZV9hZ2UgPSBzY2FsZShhZ2UpKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QobGFiZWwsIGNvZGUsIGhhcmRzaGlwX2luZGV4KQpoYXJkc2hpcAoKV1ZTX2RhdGEKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCnN1bW1hcnlfbW9kZWwwPXN1bW1hcnkobW9kZWwwKQpzdW1tYXJ5X21vZGVsMApgYGAKYGBge3J9CiMgYWdlLCBzZXggCm1vZGVsMSA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKSArICgxK3NjYWxlKGFnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCwgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCgpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMyA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKGNoaWxkcmVuKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihlbXBsb3llZCkgKyBmYWN0b3IoZWR1Y2F0aW9uKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoYWdlKSArIGZhY3RvcihnZW5kZXIpKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLGNvbnRyb2w9bG1lckNvbnRyb2wob3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApLG9wdGltaXplcj0iYm9ieXFhIiksUkVNTCA9IEZBTFNFKQoKc3VtbWFyeV9tb2RlbF8zID0gc3VtbWFyeShtb2RlbF8zKSAKCnN1bW1hcnlfbW9kZWxfMwoKCmBgYAoKYGBge3J9CiMgRGVmaW5lIGFub3ZhX3Jlc3VsdHMgbGlzdCB3aXRoIG11bHRpcGxlIGFub3ZhKCkgY2FsbHMKYW5vdmFfcmVzdWx0cyA8LSBsaXN0KAogIGFub3ZhKG1vZGVsMCwgbW9kZWwxKSwKICBhbm92YShtb2RlbDEsIG1vZGVsXzIpLAogIGFub3ZhKG1vZGVsXzIsIG1vZGVsXzMpCikKCmFub3ZhX3Jlc3VsdHMKCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGliYmxlKQoKCgpsaWJyYXJ5KGRwbHlyKQojIEZvcm1hdCBBTk9WQSByZXN1bHRzIGludG8gYSB0aWR5IGRhdGEgZnJhbWUKYW5vdmFfc3VtbWFyeSA8LSBiaW5kX3Jvd3MobGFwcGx5KGFub3ZhX3Jlc3VsdHMsIHRpZHkpLCAuaWQgPSAiQ29tcGFyaXNvbiIpCgojIFByaW50IHRoZSBzdW1tYXJ5IHRhYmxlCnByaW50KGFub3ZhX3N1bW1hcnkpCgpgYGAKYGBge3J9CiMgRXh0cmFjdCByYW5kb20gZWZmZWN0cyBmb3IgJ2NvdW50cnknCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyB5b3VyIGZpdHRlZCBsbWVyIG1vZGVsCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgoKCgoKCmBgYApgYGB7cn0KcmVncmVzc2lvbl9yZXN1bHRzX1dWUyA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBkbyhtb2RlbCA9IGxtKFpfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKGFnZSkgKyBnZW5kZXIsIGRhdGEgPSAuKSkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnRyeSA9IGZpcnN0KGNvdW50cnkpLAogICAgaW50ZXJjZXB0X3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVsxLCAxXSwKICAgIHNsb3BlX2FnZV9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXJfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzMsIDFdCiAgKQoKcmVncmVzc2lvbl9yZXN1bHRzX1dWUwoKcmFuZG9tX2VmZmVjdHMgPC0gcmFuZWYobW9kZWxfMikKcmFuZG9tX2VmZmVjdHMKCmNvbG5hbWVzKHJhbmRvbV9lZmZlY3RzKQoKCgoKCgoKCgoKCgoKCgoKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwKSkpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYApgYGB7cn0KCmBgYAoKCmBgYAoKCgo=
======= <<<<<<< HEAD <<<<<<< HEAD
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4KCiMjIFRlc3QgVGVzdCBUZXN0CgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpoYXJkc2hpcF9jb21wbGV0ZSA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9IYXJkc2hpcF9jb21wbGV0ZS54bHN4IikKaGFyZHNoaXBfY29tcGxldGUKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGU9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1sb2coaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdD1sb2coaGFyZHNoaXBfY29tcGxldGUkbGlmZV9leHBlY3QpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmlfaW5jb21lPWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRnaW5pX2luY29tZSkKaGFyZHNoaXBfY29tcGxldGUkYHByaW1hcnlfIGZlbWFsZV8gZW5yb2xsbWVudF8gcmF0ZWA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGBwcmltYXJ5XyBmZW1hbGVfIGVucm9sbG1lbnRfIHJhdGVgKQpoYXJkc2hpcF9jb21wbGV0ZQoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9jb21wbGV0ZSRtZWFuX2hvbWljaWRlPXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJEluZmFudF9tb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVfZXhwZWN0PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdCkKaGFyZHNoaXBfY29tcGxldGUkZ2luaV9pbmNvbWU9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaV9pbmNvbWUpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmlfaW5jb21lPXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRgcHJpbWFyeV8gZmVtYWxlXyBlbnJvbGxtZW50XyByYXRlYCkKaGFyZHNoaXBfY29tcGxldGUKCmhhcmRzaGlwX2NvbXBsZXRlJGhhcmRzaGlwX2luZGV4PShoYXJkc2hpcF9jb21wbGV0ZSRtZWFuX2hvbWljaWRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pX2luY29tZStoYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdCtoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5K2hhcmRzaGlwX2NvbXBsZXRlJGBwcmltYXJ5XyBmZW1hbGVfIGVucm9sbG1lbnRfIHJhdGVgKS82CgpoYXJkc2hpcF9jb21wbGV0ZQoKCmBgYApgYGB7cn0KCiMgRGF0YSBvZiBXYXZlIDUKCgpXVjVfZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvRjAwMDA3OTQ0LVdWNV9EYXRhX1JfdjIwMTgwOTEyLnJkcyIpCgoKIyBDb252ZXJ0IFdWNV9kYXRhLW9iamVjdCBpbiBkYXRhLmZyYW1lIApXVjVfZGF0YV9kZiA8LSBhcy5kYXRhLmZyYW1lKFdWNV9kYXRhKQoKIyBzaG93IGZpcnN0IGZpdmUgY29sdW1ucwpXVjVfZGF0YV9kZgpgYGAKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKYGBgCmBgYHtyfQojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKIyBBc3N1bWluZyBXVjVfZGF0YSBoYXMgYSBjb2x1bW4gbmFtZWQgY291bnRyeV9jb2RlCldWNV9kYXRhJGNvdW50cnkgPC0gY291bnRyeW5hbWVzJG5hbWVbbWF0Y2goV1Y1X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCgojIENoZWNrIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjb3VudHJ5IGluIHRoZSBuZXcgY29sdW1uCnRhYmxlKFdWNV9kYXRhJGNvdW50cnkpCgojIERpc3BsYXkgdGhlIHVwZGF0ZWQgV1Y1X2RhdGEKcHJpbnQoV1Y1X2RhdGEpCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQpXVjVfZGF0YQpXVjZfZGF0YQpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCnVuaXF1ZShXVlNfZGF0YSRhZ2UpCnJhbmdlKFdWU19kYXRhJGFnZSkKYGBgCmBgYHtyfQpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKV1ZTX2RhdGEgPC0gV1ZTX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSA9PSAiR3JlYXQgQnJpdGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsIGNvdW50cnkpKQpgYGAKYGBge3J9CiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKV1ZTX2RhdGEkcmlza3Rha2luZyA9IDYgLSBXVlNfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCldWU19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKV1ZTX2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKFdWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChXVlNfZGF0YSkKCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgaXNvY29kZSwgaGFyZHNoaXBfaW5kZXgpCmhhcmRzaGlwCmBgYApgYGB7cn0KV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCmBgYApgYGB7cn0KbGlicmFyeShsbWVyVGVzdCkKCiMgaW50ZXJjZXB0IG9ubHkgbW9kZWwKbW9kZWwwID0gbG1lcihaX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgKDF8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCnN1bW1hcnlfbW9kZWwwCmBgYApgYGB7cn0KIyBhZ2UsIHNleCAKbW9kZWwxID0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICtzY2FsZSh6X3Njb3JlX2FnZSkrZmFjdG9yKGdlbmRlcikgKyAoMStzY2FsZSh6X3Njb3JlX2FnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCm1vZGVsXzIgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgCiAgICAgICAgICAgICAgICAgKDEgKyBzY2FsZSh6X3Njb3JlX2FnZSkgKyBmYWN0b3IoZ2VuZGVyKSArIGZhY3RvcihjaGlsZHJlbikgKyAKICAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX2RhdGEpCgojIERpc3BsYXkgdGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsCnN1bW1hcnkobW9kZWxfMikKYGBgCgoKYGBge3J9Cm1vZGVsXzMgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgc2NhbGUoel9zY29yZV9hZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgfCBjb3VudHJ5KSwKICAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCgpzdW1tYXJ5KG1vZGVsXzMpCgoKCgpgYGAKCmBgYHtyfQphbm92YShtb2RlbDAsbW9kZWwxKQphbm92YShtb2RlbDEsbW9kZWxfMikKYW5vdmEobW9kZWxfMixtb2RlbF8zKSAKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYAoKCmBgYAoKCgo=
=======
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKYGBgCmBgYHtyfQpoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGU9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZSkKaGFyZHNoaXBfY29tcGxldGUkZ2RwPWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRnZHApCmhhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eT1sb2coaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1sb2coaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCgpoYXJkc2hpcF9jb21wbGV0ZQoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGU9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9c2NhbGUoLWhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eSkKaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3k9c2NhbGUoLWhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5KQpoYXJkc2hpcF9jb21wbGV0ZSRnaW5pPXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJGdpbmkpCmhhcmRzaGlwX2NvbXBsZXRlJGZlbWFsZW1hbGVfcHJpbWVkdT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1KQpoYXJkc2hpcF9jb21wbGV0ZQoKaGFyZHNoaXBfY29tcGxldGUkaGFyZHNoaXBfaW5kZXg9KGhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZStoYXJkc2hpcF9jb21wbGV0ZSRnZHAraGFyZHNoaXBfY29tcGxldGUkZ2luaStoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeStoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkraGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1KS82CgpoYXJkc2hpcF9jb21wbGV0ZQoKIyBMYXVyYSBhZGRlZCB0aGlzIGNvZGUKbGlicmFyeShkcGx5cikKCiMgSW1wdXRlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBoYXJkc2hpcCBpbmRpY2F0b3JzIHVzaW5nIHRoZSBtZWRpYW4KaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGFjcm9zcyhjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpLAogICAgICAgICAgICAgICAgfmlmZWxzZShpcy5uYSguKSwgbWVkaWFuKC4sIG5hLnJtID0gVFJVRSksIC4pKSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCmhhcmRzaGlwX2NvbXBsZXRlIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGxhYmVsID09ICJTZXJiaWEgYW5kIE1vbnRlbmVncm8iLCAiU2VyYmlhIiwgbGFiZWwpKQpoYXJkc2hpcF9jb21wbGV0ZQpgYGAKCgpgYGB7cn0KIyBEYXRhIG9mIFdhdmUgNQoKCldWNV9kYXRhIDwtIHJlYWRSRFMoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9GMDAwMDc5NDQtV1Y1X0RhdGFfUl92MjAxODA5MTIucmRzIikKCgojIENvbnZlcnQgV1Y1X2RhdGEtb2JqZWN0IGluIGRhdGEuZnJhbWUgCldWNV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUoV1Y1X2RhdGEpCgojIHNob3cgZmlyc3QgZml2ZSBjb2x1bW5zCldWNV9kYXRhX2RmCmBgYAoKCgpgYGB7cn0KI3JlbmFtZSB0aGUgdmFyaWFibGVzCldWNV9kYXRhIDwtIFdWNV9kYXRhX2RmICU+JQogIHJlbmFtZShnZW5kZXIgPSBWMjM1LCBhZ2UgPSBWMjM3LCBjb3VudHJ5X2NvZGUgPSBWMiwgd2F2ZSA9IFYxLCByaXNrdGFraW5nID0gVjg2LCBjaGlsZHJlbiA9IFY1NiwgbWFycmllZCA9IFY1NSwgZW1wbG95ZWQgPSBWMjQxLCBlZHVjYXRpb24gPSBWMjM4KQpXVjVfZGF0YQoKY29sbmFtZXMoV1Y1X2RhdGEpCgoKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNV9kYXRhIDwtIFdWNV9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSwgd2F2ZSwgcmlza3Rha2luZywgY2hpbGRyZW4sIG1hcnJpZWQsIGVtcGxveWVkLCBlZHVjYXRpb24pCldWNV9kYXRhCmBgYApgYGB7cn0KIyBSZWFkIGNvdW50cnluYW1lcyBkYXRhIGZyb20gdGhlIENTViBmaWxlICh0byBkZWNvZGUgdGhlIGRhdGFzZXQgNSkKY291bnRyeW5hbWVzIDwtIHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlciA9IEZBTFNFLCBhcy5pcyA9IFRSVUUpCmNvbG5hbWVzKGNvdW50cnluYW1lcykgPC0gYygiY29kZSIsICJuYW1lIikKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQpgYGAKYGBge3J9CiNSZWFkIERhdGFzZXQgKFdhdmUgNikKCldWNl9kYXRhIDwtIGxvYWQoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9XVjZfRGF0YV9SX3YyMDIwMTExNy5yZGF0YSIpIApXVjZfZGF0YSA8LSBXVjZfRGF0YV9SX3YyMDIwMTExNyAKcHJpbnQoV1Y2X2RhdGEpCmBgYAoKYGBge3J9CldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIHJlbmFtZSh3YXZlID0gVjEsIGdlbmRlciA9IFYyNDAsIGFnZSA9IFYyNDIsY291bnRyeV9jb2RlID0gVjIsIHJpc2t0YWtpbmcgPSBWNzYsIGNoaWxkcmVuID0gVjU4LCBtYXJyaWVkID0gVjU3LCBlbXBsb3llZCA9IFYyMjksIGVkdWNhdGlvbiA9IFYyNDgpCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKCldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3Qod2F2ZSwgZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSxyaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y2X2RhdGEKYGBgCmBgYHtyfQpjb3VudHJ5bmFtZXMgPSByZWFkLmNzdigiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL2NvdW50cnluYW1lcy50eHQiLCBoZWFkZXI9RkFMU0UsYXMuaXM9VFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA9IGMoImNvZGUiLCAibmFtZSIpCldWNl9kYXRhJGNvdW50cnkgPSBjb3VudHJ5bmFtZXMkbmFtZSBbbWF0Y2goV1Y2X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCnRhYmxlKFdWNl9kYXRhJGNvdW50cnkpCldWNl9kYXRhCmBgYApgYGB7cn0KCldWU19kYXRhID0gcmJpbmQoV1Y1X2RhdGEsIFdWNl9kYXRhKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCgoKCgoKCmBgYApgYGB7cn0KCgoKCldWU19kYXRhID0gc3Vic2V0KFdWU19kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpkYXRhX1dhdmU1ID0gc3Vic2V0KFdWNV9kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpkYXRhX1dhdmU2ID0gc3Vic2V0KFdWNl9kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpXVlNfZGF0YSA8LSBuYS5vbWl0KFdWU19kYXRhKQpkYXRhX1dhdmU1IDwtIG5hLm9taXQoZGF0YV9XYXZlNSkKZGF0YV9XYXZlNiA8LSBuYS5vbWl0KGRhdGFfV2F2ZTYpCgoKCgoKCgoKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKV1ZTX2RhdGEgPC0gV1ZTX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSA9PSAiR3JlYXQgQnJpdGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsIGNvdW50cnkpKQpgYGAKYGBge3J9CiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKV1ZTX2RhdGEkcmlza3Rha2luZyA9IDYgLSBXVlNfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCldWU19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKV1ZTX2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKFdWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChXVlNfZGF0YSkKCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCgpjb3VudHJ5X2NvdW50cyA8LSBXVlNfZGF0YSAlPiUKICBjb3VudChjb3VudHJ5KQoKIyBQcmludCB0aGUgcmVzdWx0CnByaW50KGNvdW50cnlfY291bnRzKQoKCgoKYGBgCgpgYGB7cn0KCldWU19kYXRhJGdlbmRlciA9IGlmZWxzZShXVlNfZGF0YSRnZW5kZXIgPT0gMSwgMCwgMSkgIyBzZXg6IG1hbGUgdnMuIGZlbWFsZQpXVlNfZGF0YSRjaGlsZHJlbiA9IGlmZWxzZShXVlNfZGF0YSRjaGlsZHJlbiA9PSAwLCAwLCAxKSAjIGNoaWxkcmVuOiBubyB2cy4geWVzCldWU19kYXRhJG1hcnJpZWQgPSBpZmVsc2UoV1ZTX2RhdGEkbWFycmllZCA9PSAxLCAxLCAwKSAjIG1hcnJpZWQ6IHllcyB2cy4gbm8KV1ZTX2RhdGEkZW1wbG95ZWQgPSBpZmVsc2UoV1ZTX2RhdGEkZW1wbG95ZWQgPCA0LCAxLCAwKSAjIGVtcGxveWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVkdWNhdGlvbiA9IGlmZWxzZShXVlNfZGF0YSRlZHVjYXRpb24gPCA0LCAwLCAxKSAjIGVkdWNhdGlvbjogbm8gcHJpbWFyeSB2cy4gcHJpbWFyeSsgCgoKaGFyZHNoaXAgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgZHBseXI6OnNlbGVjdChsYWJlbCwgY29kZSwgaGFyZHNoaXBfaW5kZXgpCmhhcmRzaGlwCgoKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfZGF0YSkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCnN1bW1hcnlfbW9kZWwwCmBgYApgYGB7cn0KIyBhZ2UsIHNleCAKbW9kZWwxID0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICtzY2FsZShhZ2UpK2ZhY3RvcihnZW5kZXIpICsgKDErc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKXxjb3VudHJ5KSxkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQpzdW1tYXJ5X21vZGVsMT1zdW1tYXJ5KG1vZGVsMSkKc3VtbWFyeV9tb2RlbDEKYGBgCgpgYGB7cn0KI21vZGVsIDIKbGlicmFyeShsbWU0KQoKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQoKIyBEZWZpbmUgdGhlIGxtZXIgbW9kZWwgYW5kIGFzc2lnbiBpdCB0byAnbW9kZWxfMicKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpICsKICAgICAgICAgICAgICAgICAoMSArIHNjYWxlKGFnZSkgKyBmYWN0b3IoZ2VuZGVyKSArIGZhY3RvcihjaGlsZHJlbikgKyBmYWN0b3IoZW1wbG95ZWQpICsKICAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQptb2RlbF8zIDwtIGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArIHNjYWxlKGFnZSkgKiBoYXJkc2hpcF9pbmRleCArIAogICAgICAgICAgICAgICAgICAgIGZhY3RvcihnZW5kZXIpICogaGFyZHNoaXBfaW5kZXggKyBmYWN0b3IobWFycmllZCkgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpICsgCiAgICAgICAgICAgICAgICAgICAgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgfCBjb3VudHJ5KSwKICAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwsY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKCnN1bW1hcnlfbW9kZWxfMyA9IHN1bW1hcnkobW9kZWxfMykgCgpzdW1tYXJ5X21vZGVsXzMKCgpgYGAKCmBgYHtyfQojIERlZmluZSBhbm92YV9yZXN1bHRzIGxpc3Qgd2l0aCBtdWx0aXBsZSBhbm92YSgpIGNhbGxzCmFub3ZhX3Jlc3VsdHMgPC0gbGlzdCgKICBhbm92YShtb2RlbDAsIG1vZGVsMSksCiAgYW5vdmEobW9kZWwxLCBtb2RlbF8yKSwKICBhbm92YShtb2RlbF8yLCBtb2RlbF8zKQopCgphbm92YV9yZXN1bHRzCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHRpYmJsZSkKCgoKbGlicmFyeShkcGx5cikKIyBGb3JtYXQgQU5PVkEgcmVzdWx0cyBpbnRvIGEgdGlkeSBkYXRhIGZyYW1lCmFub3ZhX3N1bW1hcnkgPC0gYmluZF9yb3dzKGxhcHBseShhbm92YV9yZXN1bHRzLCB0aWR5KSwgLmlkID0gIkNvbXBhcmlzb24iKQoKIyBQcmludCB0aGUgc3VtbWFyeSB0YWJsZQpwcmludChhbm92YV9zdW1tYXJ5KQoKYGBgCmBgYHtyfQojIEV4dHJhY3QgcmFuZG9tIGVmZmVjdHMgZm9yICdjb3VudHJ5JwojIEFzc3VtaW5nICdtb2RlbCcgaXMgeW91ciBmaXR0ZWQgbG1lciBtb2RlbApyYW5kb21fZWZmZWN0cyA8LSByYW5lZihtb2RlbF8yKQpyYW5kb21fZWZmZWN0cwoKCgoKCgpgYGAKYGBge3J9CnJlZ3Jlc3Npb25fcmVzdWx0c19XVlMgPC0gV1ZTX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgZG8obW9kZWwgPSBsbShaX3Njb3JlX3Jpc2t0YWtpbmcgfiBzY2FsZShhZ2UpICsgZ2VuZGVyLCBkYXRhID0gLikpICU+JQogIHN1bW1hcml6ZSgKICAgIGNvdW50cnkgPSBmaXJzdChjb3VudHJ5KSwKICAgIGludGVyY2VwdF9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMSwgMV0sCiAgICBzbG9wZV9hZ2VfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzIsIDFdLAogICAgc2xvcGVfZ2VuZGVyX3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVszLCAxXQogICkKCnJlZ3Jlc3Npb25fcmVzdWx0c19XVlMKCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgpjb2xuYW1lcyhyYW5kb21fZWZmZWN0cykKCgoKCgoKCgoKCgoKCgoKCmBgYAoKYGBge3J9CmNvZWZzYWxsbW9kZWxzPXJiaW5kKHN1bW1hcnlfbW9kZWwxJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbF8yJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbF8zJGNvZWZmaWNpZW50c1tjKDE6Miw0OjgsMyw5OjEwKSxdKQoKd3JpdGUuY3N2KGNvZWZzYWxsbW9kZWxzLCJjb2Vmc2FsbG1vZGVscy5jc3YiKQpgYGAKCgpgYGB7cn0KIyBSZWFkIHRoZSBDU1YgZmlsZSBpbnRvIGEgZGF0YSBmcmFtZQpnYmRfbWVudGFsaGVhbHRoIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9HQkRfbWVudGFsaGVhbHRoLnhsc3giKQoKZ2JkX21lbnRhbGhlYWx0aAoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKZ2JkX21lbnRhbGhlYWx0aCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgZ2VuZGVyLCBhZ2UsIGNhdXNlLCB2YWwsIE1lYXN1cmUpCmdiZF9tZW50YWxoZWFsdGgKCgpsaWJyYXJ5KGRwbHlyKQoKIyBHcm91cCBkYXRhIGJ5IGNvdW50cnkgYW5kIGFnZSBncm91cCwgYW5kIGNhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MKc3VtbWFyeV9ieV9jb3VudHJ5X2FnZSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbl9EQUxZcyA9IG1lYW4odmFsKSkgICMgQ2FsY3VsYXRlIG1lYW4gb2YgREFMWXMKCmxpYnJhcnkoZHBseXIpCgojIEFzc3VtaW5nICdzdW1tYXJ5X2J5X2NvdW50cnlfYWdlJyBjb250YWlucyB5b3VyIHN1bW1hcml6ZWQgZGF0YXNldAptZWFuX2J5X2NvdW50cnkgPC0gc3VtbWFyeV9ieV9jb3VudHJ5X2FnZSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9EQUxZcyA9IG1lYW4obWVhbl9EQUxZcykpCgojIFZpZXcgdGhlIHJlc3VsdGluZyBtZWFuIGJ5IGNvdW50cnkKcHJpbnQobWVhbl9ieV9jb3VudHJ5KQoKI2xvZyB0cmFuc2Zvcm0KbWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXM9bG9nKG1lYW5fYnlfY291bnRyeSRtZWFuX0RBTFlzKQogCm1lYW5fYnlfY291bnRyeSAKCiNSZXZlcnNlIGNvZGllcnVuZyAKbWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXM9c2NhbGUobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCgptZWFuX2J5X2NvdW50cnkKCiNyZW5hbWUgbWVhbl9EQUxZUwptZW50YWxfaGVhbHRoX2luZGV4IDwtIG1lYW5fYnlfY291bnRyeSAlPiUKICByZW5hbWUoJ21lbnRhbF9oZWFsdGgnID0gbWVhbl9EQUxZcykKbWVudGFsX2hlYWx0aF9pbmRleAoKYGBgCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKIyMjIyMjI0FueGlldHkgZGlzb3JkZXJzIyMjIyMjIyMjCiNGaWx0ZXIgZGF0YSBmb3IgYSBzcGVjaWZpYyBtZW50YWwgZGlzb3JkZXIgKGUuZy4sIEFueGlldHkgRGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW54aWV0eSBkaXNvcmRlcnMiKSAgIyBDaGFuZ2UgIkFueGlldHkgRGlzb3JkZXJzIiB0byB0aGUgZGVzaXJlZCBkaXNvcmRlcgoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERpc2FiaWxpdHktQWRqdXN0ZWQgTGlmZSBZZWFycykgYWNyb3NzIGxvY2F0aW9ucyBhbmQgYWdlcwptZWFuX0RBTFlzIDwtIG1lYW4oYW54aWV0eV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBpZiB5b3Ugd2FudCB0byBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5OgphbnhpZXR5X2Rpc29yZGVycyA8LSBhbnhpZXR5X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9BbnhpZXR5X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCmFueGlldHlfZGlzb3JkZXJzCgojbG9nIHRyYW5zZm9ybQphbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzPWxvZyhhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQogCmFueGlldHlfZGlzb3JkZXJzCgojUmV2ZXJzZSBjb2RpZXJ1bmcgCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9c2NhbGUoYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycykKYW54aWV0eV9kaXNvcmRlcnMKbWVudGFsX2hlYWx0aF9pbmRleAoKYGBgCmBgYHtyfQpnYmRfbWVudGFsaGVhbHRoCgojIEFzc3VtaW5nIGdiZF9tZW50YWxoZWFsdGggaXMgeW91ciBkYXRhIGZyYW1lIGNvbnRhaW5pbmcgdGhlICdjYXVzZScgY29sdW1uCgojIEdldCB1bmlxdWUgdmFsdWVzIG9mICdjYXVzZScgY29sdW1uCnVuaXF1ZV9jYXVzZXMgPC0gdW5pcXVlKGdiZF9tZW50YWxoZWFsdGgkY2F1c2UpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB1bmlxdWUgY2F1c2VzCmNhdXNlX3RhYmxlIDwtIGRhdGEuZnJhbWUoQ2F1c2UgPSB1bmlxdWVfY2F1c2VzKQoKIyBQcmludCB0aGUgY2F1c2UgdGFibGUKcHJpbnQoY2F1c2VfdGFibGUpCgoKYGBgCmBgYHtyfQojIyMjIyMjQnVsaW1pYSBuZXJ2b3NhIyMjIyMjIyMKbGlicmFyeShkcGx5cikKCiMgRmlsdGVyIHRoZSBkYXRhIGZvciAnQnVsaW1pYSBOZXJ2b3NhJwpidWxpbWlhX25lcnZvc2EgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkJ1bGltaWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihidWxpbWlhX25lcnZvc2EkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmJ1bGltaWFfbmVydm9zYSA8LSBidWxpbWlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYnVsaW1pYV9uZXJ2b3NhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhIDwtIGxvZyhidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhIDwtIHNjYWxlKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJ1bGltaWFfbmVydm9zYSkKcHJpbnQoYW54aWV0eV9kaXNvcmRlcnMpCgpnYmRfbWVudGFsaGVhbHRoCgpgYGAKYGBge3J9CiMjIyMjQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlcgpsaWJyYXJ5KGRwbHlyKQoKCkFESEQgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF0dGVudGlvbi1kZWZpY2l0L2h5cGVyYWN0aXZpdHkgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oQURIRCR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKQURIRCA8LSBBREhEICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FESEQgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpBREhEJG1lYW5fQURIRCA8LSBsb2coQURIRCRtZWFuX0FESEQpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKQURIRCRtZWFuX0FESEQgPC0gc2NhbGUoQURIRCRtZWFuX0FESEQpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChBREhEKQoKYGBgCmBgYHtyfQojIyMjIyMjIyNJZGlvcGF0aGljIGRldmVsb3BtZW50IGludGVsbGVjdHVhbCBhYmlsaXR5IApsaWJyYXJ5KGRwbHlyKQoKCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiSWRpb3BhdGhpYyBkZXZlbG9wbWVudGFsIGludGVsbGVjdHVhbCBkaXNhYmlsaXR5IikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gbG9nKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gc2NhbGUoSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQpgYGAKYGBge3J9CiMjIyMjI0Fub3JleGlhIE5lcnZvc2EKCmFub3JleGlhX25lcnZvc2EgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFub3JleGlhIG5lcnZvc2EiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYW5vcmV4aWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYW5vcmV4aWFfbmVydm9zYSA8LSBhbm9yZXhpYV9uZXJ2b3NhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2Fub3JleGlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBsb2coYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EgPC0gc2NhbGUoYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhbm9yZXhpYV9uZXJ2b3NhKQpgYGAKYGBge3J9CiMjIyMjRGVwcmVzc2l2ZSBkaXNvcmRlcnMjIyMjIyMjCgpkZXByZXNzaXZlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRGVwcmVzc2l2ZSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGRlcHJlc3NpdmVfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycyA8LSBsb2coZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIHNjYWxlKGRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChkZXByZXNzaXZlX2Rpc29yZGVycykKYGBgCgpgYGB7cn0KIyMjIyMjI0F1dGlzbXVzIHNwZWN0cnVtIGRpc29yZGVycyMjIyMjIwoKYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBdXRpc20gc3BlY3RydW0gZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzIDwtIGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gbG9nKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gc2NhbGUoYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyNTY2hpem9waHJlbmlhIyMjIyMjIwpzY2hpem9waHJlbmlhIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJTY2hpem9waHJlbmlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHNjaGl6b3BocmVuaWEkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CnNjaGl6b3BocmVuaWEgPC0gc2NoaXpvcGhyZW5pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zY2hpem9waHJlbmlhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4Kc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gbG9nKHNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCnNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhIDwtIHNjYWxlKHNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc2NoaXpvcGhyZW5pYSkKCmBgYAoKYGBge3J9CiMjIyMjIyNDb25kdWN0IGRpc29yZGVycyMjIyMjIyMjIwpjb25kdWN0X2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQ29uZHVjdCBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihjb25kdWN0X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKY29uZHVjdF9kaXNvcmRlcnMgPC0gY29uZHVjdF9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzIDwtIGxvZyhjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gc2NhbGUoY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGNvbmR1Y3RfZGlzb3JkZXJzKQoKCmBgYAoKYGBge3J9CiMjIyMjIyMjRWF0aW5nIGRpc29yZGVycyMjIyMjIyMjIwplYXRpbmdfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJFYXRpbmcgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGVhdGluZ19kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmVhdGluZ19kaXNvcmRlcnMgPC0gZWF0aW5nX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9lYXRpbmdfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gbG9nKGVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzIDwtIHNjYWxlKGVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZWF0aW5nX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjIyNCaXBvbGFyIGRpc29yZGVyIyMjIyMjIyMjCmJpcG9sYXJfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkJpcG9sYXIgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYmlwb2xhcl9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYmlwb2xhcl9kaXNvcmRlciA8LSBiaXBvbGFyX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2JpcG9sYXJfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBsb2coYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIgPC0gc2NhbGUoYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChiaXBvbGFyX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQpwcmludChjYXVzZV90YWJsZSkKYGBgCmBgYHtyfQojIyMjIyMjI1N1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIyMjIyMjIyMKCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJTdWJzdGFuY2UgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzIDwtIGxvZyhzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjRHJ1ZyB1c2UgZGlzb3JkZXJzCgpkcnVnX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkRydWcgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkcnVnX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmRydWdfdXNlX2Rpc29yZGVycyA8LSBkcnVnX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGxvZyhkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRydWdfdXNlX2Rpc29yZGVycykKCgpgYGAKYGBge3J9CiMjIyMjIyMjIyNBbGNvaG9sIHVzZSBkaXNvcmRlcnMKYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbGNvaG9sIHVzZSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYWxjb2hvbF91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gYWxjb2hvbF91c2VfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBsb2coYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyMjIyNNYWpvciBkZXByZXNzaXZlIGRpc29yZGVycwptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJNYWpvciBkZXByZXNzaXZlIGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5Cm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gbG9nKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyIDwtIHNjYWxlKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlcikKCmBgYApgYGB7cn0KIyMjIyMjI0R5c3RoeW1pYSMjIyMjIyMjCgpkeXN0aHltaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkR5c3RoeW1pYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkeXN0aHltaWEkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmR5c3RoeW1pYSA8LSBkeXN0aHltaWEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHlzdGh5bWlhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhIDwtIGxvZyhkeXN0aHltaWEkbWVhbl9keXN0aHltaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhIDwtIHNjYWxlKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGR5c3RoeW1pYSkKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIFBlcmZvcm0gbGVmdCBqb2lucyBmb3IgZWFjaCBkYXRhIGZyYW1lIG9uICdjb3VudHJ5JwpmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4IDwtIG1lbnRhbF9oZWFsdGhfaW5kZXggJT4lCiAgbGVmdF9qb2luKGJ1bGltaWFfbmVydm9zYSwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihBREhELCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbm9yZXhpYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRlcHJlc3NpdmVfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihjb25kdWN0X2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihzY2hpem9waHJlbmlhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGVhdGluZ19kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYmlwb2xhcl9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkcnVnX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYWxjb2hvbF91c2VfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZHlzdGh5bWlhLCBieSA9ICJjb3VudHJ5IikKCiMgRGlzcGxheSB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCkKCiMgU2hvdyB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCmhlYWQoZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCkKCmBgYApgYGB7cn0KaW5kaWNhdG9ycyA8LSBsZWZ0X2pvaW4oZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQppbmRpY2F0b3JzCmhlYWQoaW5kaWNhdG9ycykKCm5ld19kYXRhIDwtIGxlZnRfam9pbiAoV1ZTX2RhdGEsIGluZGljYXRvcnMsIGJ5ID0gImNvdW50cnkiKQpuZXdfZGF0YQoKCiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKbmV3X2RhdGEkcmlza3Rha2luZyA9IDYgLSBuZXdfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKbmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUobmV3X2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCm5ld19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKbmV3X2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKG5ld19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChuZXdfZGF0YSkKCm5ld19kYXRhIDwtIG5ld19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCm5ld19kYXRhCmBgYApgYGB7cn0KbGlicmFyeShsbWU0KQoKbGlicmFyeShsbWU0KQoKbW9kZWwgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiBzY2FsZSh6X3Njb3JlX2FnZSkgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZ2VuZGVyICogbWVudGFsX2hlYWx0aCArCiAgICAgICAgICAgICAgIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihjaGlsZHJlbikgKwogICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgKwogICAgICAgICAgICAgICAoMSArIHNjYWxlKHpfc2NvcmVfYWdlKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihjaGlsZHJlbikgKyAKICAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSB8IGNvdW50cnkpLAogICAgICAgICAgICAgZGF0YSA9IG5ld19kYXRhLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCnN1bW1hcnkobW9kZWwpCgojIEFzc3VtaW5nICdtb2RlbCcgaXMgYSBsaW5lYXIgbWl4ZWQtZWZmZWN0cyBtb2RlbCAobG1lciksIGFuZCB5b3Ugd2FudCB0byBzYXZlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCgojIEV4dHJhY3QgY29lZmZpY2llbnRzIGZyb20gdGhlIG1vZGVsIHN1bW1hcnkKY29lZmZpY2llbnRzX2RmIDwtIGRhdGEuZnJhbWUoc3VtbWFyeShtb2RlbCkkY29lZmZpY2llbnRzKQoKIyBXcml0ZSBjb2VmZmljaWVudHMgdG8gYSBDU1YgZmlsZQp3cml0ZS5jc3YoY29lZmZpY2llbnRzX2RmLCAibW9kZWxfY29lZmZpY2llbnRzLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCgpgYGAKYGBge3J9CgpgYGAKCgpgYGAKCgoK
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 =======
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1sb2coaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFJldmVyc2UgQ29kaWVydW5nCmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1zY2FsZShoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaSkKaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpCmhhcmRzaGlwX2NvbXBsZXRlCgpoYXJkc2hpcF9jb21wbGV0ZSRoYXJkc2hpcF9pbmRleD0oaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pK2hhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5K2hhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eStoYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpLzYKCmhhcmRzaGlwX2NvbXBsZXRlCgojIExhdXJhIGFkZGVkIHRoaXMgY29kZQpsaWJyYXJ5KGRwbHlyKQoKIyBJbXB1dGUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGhhcmRzaGlwIGluZGljYXRvcnMgdXNpbmcgdGhlIG1lZGlhbgpoYXJkc2hpcF9jb21wbGV0ZSA8LSBoYXJkc2hpcF9jb21wbGV0ZSAlPiUKICBtdXRhdGUoYWNyb3NzKGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IiwgImdpbmkiLCAiZmVtYWxlbWFsZV9wcmltZWR1IiksCiAgICAgICAgICAgICAgICB+aWZlbHNlKGlzLm5hKC4pLCBtZWRpYW4oLiwgbmEucm0gPSBUUlVFKSwgLikpKQoKaGFyZHNoaXBfY29tcGxldGUKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UobGFiZWwgPT0gIlNlcmJpYSBhbmQgTW9udGVuZWdybyIsICJTZXJiaWEiLCBsYWJlbCkpCmhhcmRzaGlwX2NvbXBsZXRlCmBgYApgYGB7cn0KIyBDaGVja2luZyBMb2cgVHJhbnNmb3JtYXRpb24gYW5kIFNjYWxpbmcvUmV2ZXJzaW5nOgoKc3VtbWFyeShoYXJkc2hpcF9jb21wbGV0ZVssIGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IildKQojIFZpc3VhbGl6ZSBkaXN0cmlidXRpb25zIGJlZm9yZSBhbmQgYWZ0ZXIgdHJhbnNmb3JtYXRpb24KZ2dwbG90KGhhcmRzaGlwX2NvbXBsZXRlLCBhZXMoeCA9IGdkcCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQmVmb3JlIFRyYW5zZm9ybWF0aW9uIikgKwogIHhsYWIoIkdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKCmdncGxvdChoYXJkc2hpcF9jb21wbGV0ZSwgYWVzKHggPSBzY2FsZSgtZ2RwKSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQWZ0ZXIgU2NhbGluZy9SZXZlcnNpbmciKSArCiAgeGxhYigiU2NhbGVkL1JldmVyc2VkIEdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKYGBgCgojIENoZWNraW5nIEVmZmVjdGl2ZW5lc3Mgb2YgSW1wdXRhdGlvbiBNZXRob2QKYGBge3J9CnN1bW1hcnkoaGFyZHNoaXBfY29tcGxldGVbLCBjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpXSkKYGBgCgoKCmBgYHtyfQojIERhdGEgb2YgV2F2ZSA1CgoKV1Y1X2RhdGEgPC0gcmVhZFJEUygiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL0YwMDAwNzk0NC1XVjVfRGF0YV9SX3YyMDE4MDkxMi5yZHMiKQoKCiMgQ29udmVydCBXVjVfZGF0YS1vYmplY3QgaW4gZGF0YS5mcmFtZSAKV1Y1X2RhdGFfZGYgPC0gYXMuZGF0YS5mcmFtZShXVjVfZGF0YSkKCiMgc2hvdyBmaXJzdCBmaXZlIGNvbHVtbnMKV1Y1X2RhdGFfZGYKYGBgCgoKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKCgojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQp1bmlxdWUoV1Y1X2RhdGEkY291bnRyeSkKCnByaW50KGNvdW50cnluYW1lcykKCmNvdW50cnlfY291bnRzIDwtIFdWNV9kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQoKCgpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCmNvdW50cnlfY291bnRzIDwtIFdWU19kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCgoKCgoKCgpgYGAKYGBge3J9CgoKCgpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCgoKCgoKCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIkdyZWF0IEJyaXRhaW4iLCAiVW5pdGVkIEtpbmdkb20iLCBjb3VudHJ5KSkKYGBgCmBgYHtyfQojIFRyYW5zZnJvbSByaXNrIGl0ZW0gc3VjaCB0aGF0IGhpZ2ggdmFsdWVzIHJlcHJlc2VudCBtb3JlIHJpc2sgdGFraW5nCldWU19kYXRhJHJpc2t0YWtpbmcgPSA2IC0gV1ZTX2RhdGEkcmlza3Rha2luZyArIDEKCiAgCiMgVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBULXNjb3JlIChtZWFuID0gNTAsIHNkID0gMTApCldWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyA9IDEwKnNjYWxlKFdWU19kYXRhJHJpc2t0YWtpbmcsIGNlbnRlcj1UUlVFLHNjYWxlPVRSVUUpKzUwCgpXVlNfZGF0YQoKI1RyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gWiBzY29yZSAKCiMgQXNzdW1pbmcgVC1zY29yZXMgaGF2ZSBhIG1lYW4gb2YgNTAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEwCldWU19kYXRhJFpfc2NvcmVfcmlza3Rha2luZyA9IChXVlNfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgLSA1MCkgLyAxMAoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoV1ZTX2RhdGEpCgpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoel9zY29yZV9hZ2UgPSBzY2FsZShhZ2UpKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QobGFiZWwsIGNvZGUsIGhhcmRzaGlwX2luZGV4KQpoYXJkc2hpcAoKV1ZTX2RhdGEKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCnN1bW1hcnlfbW9kZWwwPXN1bW1hcnkobW9kZWwwKQpzdW1tYXJ5X21vZGVsMApgYGAKYGBge3J9CiMgYWdlLCBzZXggCm1vZGVsMSA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKSArICgxK3NjYWxlKGFnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCwgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCgpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMyA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKGNoaWxkcmVuKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihlbXBsb3llZCkgKyBmYWN0b3IoZWR1Y2F0aW9uKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoYWdlKSArIGZhY3RvcihnZW5kZXIpKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLGNvbnRyb2w9bG1lckNvbnRyb2wob3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApLG9wdGltaXplcj0iYm9ieXFhIiksUkVNTCA9IEZBTFNFKQoKc3VtbWFyeV9tb2RlbF8zID0gc3VtbWFyeShtb2RlbF8zKSAKCnN1bW1hcnlfbW9kZWxfMwoKCmBgYAoKYGBge3J9CiMgRGVmaW5lIGFub3ZhX3Jlc3VsdHMgbGlzdCB3aXRoIG11bHRpcGxlIGFub3ZhKCkgY2FsbHMKYW5vdmFfcmVzdWx0cyA8LSBsaXN0KAogIGFub3ZhKG1vZGVsMCwgbW9kZWwxKSwKICBhbm92YShtb2RlbDEsIG1vZGVsXzIpLAogIGFub3ZhKG1vZGVsXzIsIG1vZGVsXzMpCikKCmFub3ZhX3Jlc3VsdHMKCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGliYmxlKQoKCgpsaWJyYXJ5KGRwbHlyKQojIEZvcm1hdCBBTk9WQSByZXN1bHRzIGludG8gYSB0aWR5IGRhdGEgZnJhbWUKYW5vdmFfc3VtbWFyeSA8LSBiaW5kX3Jvd3MobGFwcGx5KGFub3ZhX3Jlc3VsdHMsIHRpZHkpLCAuaWQgPSAiQ29tcGFyaXNvbiIpCgojIFByaW50IHRoZSBzdW1tYXJ5IHRhYmxlCnByaW50KGFub3ZhX3N1bW1hcnkpCgpgYGAKYGBge3J9CiMgRXh0cmFjdCByYW5kb20gZWZmZWN0cyBmb3IgJ2NvdW50cnknCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyB5b3VyIGZpdHRlZCBsbWVyIG1vZGVsCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgoKCgoKCmBgYApgYGB7cn0KcmVncmVzc2lvbl9yZXN1bHRzX1dWUyA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBkbyhtb2RlbCA9IGxtKFpfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKGFnZSkgKyBnZW5kZXIsIGRhdGEgPSAuKSkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnRyeSA9IGZpcnN0KGNvdW50cnkpLAogICAgaW50ZXJjZXB0X3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVsxLCAxXSwKICAgIHNsb3BlX2FnZV9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXJfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzMsIDFdCiAgKQoKcmVncmVzc2lvbl9yZXN1bHRzX1dWUwoKcmFuZG9tX2VmZmVjdHMgPC0gcmFuZWYobW9kZWxfMikKcmFuZG9tX2VmZmVjdHMKCmNvbG5hbWVzKHJhbmRvbV9lZmZlY3RzKQoKCgoKCgoKCgoKCgoKCgoKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwKSkpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYApgYGB7cn0KCmBgYAoKCmBgYAoKCgo=
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648 >>>>>>> Stashed changes